package sanrenxing.dayEnd.backRepertoryTotal.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import sanrenxing.dayEnd.backRepertoryTotal.dao.EarningCountDao;
import sanrenxing.dayEnd.backRepertoryTotal.domain.BoundCountExtrat;
import sanrenxing.dayEnd.backRepertoryTotal.domain.CashCountExtrat;
import sanrenxing.dayEnd.backRepertoryTotal.domain.ManagerMoney;
import sanrenxing.dayEnd.backRepertoryTotal.service.EarningCountService;
import sanrenxing.dayEnd.backRepertoryTotal.utils.sdf;

import java.util.ArrayList;
import java.util.List;

/**
 * @authors name:邓志强
 * @descriptions:收益计提业务层类
 * @date: 2021/5/15 15:02
 * @version:1.0
 */
@Repository("/earningCountService")
public class EarningCountServiceImpl implements EarningCountService {
    //注入收益计提dao对象
    @Autowired
    private EarningCountDao earningCountDao;

    //注入日期推算对象
    @Autowired
    private sdf ss;

    /**
     * 收益计提查询数据
     * @return 返回收益计提数据
     */
    @Override
    public List<CashCountExtrat> queryCashCount(int limit,int page) {
        //调用现金存款业务方法，取出数据,传入行页
        List<CashCountExtrat> extrats = earningCountDao.queryCashDeposit(limit,page);
        //调用现金库存方法，取出数据，传入行页
        List<CashCountExtrat> extrats1 = earningCountDao.queryCashCountToStock(limit,page);
        //将现金库存中的现金利息数据都添加到存款业务集合当中
        for (CashCountExtrat extrat : extrats1) {
            //添加到集合当中
            extrats.add(extrat);
        }
        //返回数据
        return extrats;
    }

    /**
     * 收益计提查询数现金行数
     * @return
     */
    @Override
    public int CashCount(){
        //收益计提取得现金(存款)利息行数定义变量接收：现金数据行数
        int cashCount = earningCountDao.cashCount();
        //收益计提取得现金库存利息行数定义变量接收：现金库存行数
        int cashStockCount = earningCountDao.cashStockCount();
        //返回现金利息加上存款利息
        return cashCount+cashStockCount;
    }

    /**
     * 债券收益计提数据显示
     * @return 返回债券利息数据
     */
    @Override
    public List<BoundCountExtrat> queryBound(int limit,int page) {
        //调用显示债券利息的方法，传入行页
        return earningCountDao.queryBound(limit,page);
    }

    /**
     * 债券收益计提行数
     * @return 返回行数
     */
    @Override
    public int bondCount() {
        //调用查询债券行数的方法
        return earningCountDao.bondCount();
    }

    /**
     * 两费收益计提数据显示
     * @return 返回两费数据
     */
    @Override
    public List<ManagerMoney> ManagerQeury() {
        //创建一个保存两费数据的集合
        List<ManagerMoney> list = new ArrayList<>();
        //将托管费添加到集合当中
        list.add(earningCountDao.custoIdQuery());
        //将管理费添加到集合当中
        list.add(earningCountDao.adminIdQuery());
        //查询昨日资产净值，如果不为null就说明有数据，定义变量接收
        Double aDouble = earningCountDao.yesterdayMoneyValue();
        //判断是否为空，不为空则遍历两费集合
        if (aDouble!=null){
            //遍历两费的集合
            for (ManagerMoney managerMoney : list) {
                //将集合中的基金净值修改为昨日资产净值
                managerMoney.setFundNet(aDouble);
            }
        }
        //返回两费数据的集合
        return list;
    }

    /**
     * 收益计提点击统计按钮后将收益计提的数据添加到应收应付
     */
    @Override
    public Boolean Alipay() {
        try {
            //定义保存昨日资产净值的变量，赋默认值
            double moeny=0.0;
            //查询昨日资产净值，如果不为空就说明有数据，定义变量接收
            Double aDouble = earningCountDao.yesterdayMoneyValue();
            //判断不为空
            if (aDouble!=null){
                //不为空则将值保存到定义的变量中
                moeny=aDouble;
            }
            //调用工具类中的判断昨日知否为节假日，判断当天是否为节假日之后的第一天，如果是节假日过后第一天的话，则节假日的现金存款和债券利息都要有节假日的
            int days = ss.holidayInterest();
            //调用两费支付方法，传入昨日资产净值
            earningCountDao.adCuAlipay(moeny);
            //调用债券支付方法，传入节假日之后时间天数
            earningCountDao.bondAlipay(days);
            //调用现金支付方法，传入节假日之后时间天数
            earningCountDao.cashAlipay(days);
            //返回正常
            return true;
        }catch (Exception e){
            return false;
        }
    }
}
